package com.hwua.tqm;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public abstract class FatherTable extends JPanel {

	DefaultTableModel tableModel; // 默认显示的表格
	JButton add, addSave, del, delMore, updateSave, refresh, search; // 各处理按钮
	JTable table; // 表格

	JPanel panelUP; // 增加信息的面板
	String[] columnNames = null; // 列名数组
	Object[][] rowData = null; // 表格中数据

	// 构造函数
	public FatherTable() {
		this.columnNames = columnNamesInit();
		this.rowData = tableDataInit();
		this.setBounds(300, 200, 650, 450); // 设置窗体大小
		this.setLayout(new BorderLayout()); // 设置窗体的布局方式
		// 新建各按钮组件
		add = new JButton("增加行");
		addSave = new JButton("插入保存");
		del = new JButton("删除");
		delMore = new JButton("多选删除");
		updateSave = new JButton("修改保存");
		search = new JButton("搜索");
		refresh = new JButton("刷新");

		panelUP = new JPanel(); // 新建按钮组件面板
		panelUP.setLayout(new FlowLayout(FlowLayout.LEFT)); // 设置面板的布局方式

		// 将各按钮组件依次添加到面板中
		panelUP.add(add);
		panelUP.add(addSave);
		panelUP.add(del);
		panelUP.add(delMore);
		panelUP.add(updateSave);
		panelUP.add(search);
		panelUP.add(refresh);
		// 新建表格
		tableModel = new DefaultTableModel(rowData, columnNames);
		table = new JTable(tableModel);

		JScrollPane s = new JScrollPane(table);

		// 将面板和表格分别添加到窗体中
		this.add(panelUP, BorderLayout.NORTH);
		this.add(s);

		// 事件处理
		MyEvent();

		this.setVisible(true); // 显示窗体
	}

	// 事件处理
	public void MyEvent() {

		// 增加
		add.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 增加一行空白区域
				tableModel.addRow(new Vector());
			}

		});
		// 增加保存
		addSave.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				int columnCount = table.getColumnCount(); // 表格列数
				int rowcount = table.getSelectedRow();
				if (rowcount == -1) {
					// 显示错误信息提示框
					showErrorMsg("请选择要保存的行");
					return;
				}
				Object[] values = new Object[columnCount]; // 声明表格行中获取数据数组
				for (int j = 0; j < columnCount; j++) {
					values[j] = table.getValueAt(rowcount, j);
				}
				addSaveAction(values);

			}

		});

		// 删除
		del.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				// 删除指定行
				int rowid = table.getSelectedRow();
				if (rowid == -1) {
					// 显示错误信息提示框
					showErrorMsg("请选择要保存的行");
					return;
				}
				boolean is = showConfirm("确认删除该信息吗?");
				if (!is) { // 取消删除操作
					return;
				}
				Object value = table.getValueAt(rowid, 0);
				deleteAction(value); // 执行单行删除操作
				if (rowid >= 0) {
					tableModel.removeRow(rowid);
				}

			}

		});
		// 多选删除
		delMore.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				// 删除指定行
				int[] rows = table.getSelectedRows();
				if (rows.length == 0) {
					// 显示错误信息提示框
					showErrorMsg("请选择要删除的行");
					return;
				}
				boolean is = showConfirm("确认删除选中信息吗?");
				if (!is) { // 取消删除操作
					return;
				}
				Object[] values = new Object[rows.length]; // 保存选中的多行第一个列的值
				for (int i = 0; i < rows.length; i++) {
					values[i] = table.getValueAt(rows[i], 0);
				}
				deleteMoreAction(values); // 删除多条数据
				// 从表格中删除数据 先删除rowid大的记录 否则会导致删除失败，提示错误
				for (int k = rows.length - 1; k >= 0; k--) {
					tableModel.removeRow(rows[k]);
				}

			}

		});

		/**
		 * 保存
		 */
		updateSave.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				int columnCount = table.getColumnCount(); // 表格列数
				int rowcount = table.getSelectedRow(); // 选中的行
				if (rowcount == -1) {
					// 显示错误信息提示框
					showErrorMsg("请选择要保存的行");
					return;
				}
				Object[] values = new Object[columnCount]; // 声明表格行中获取数据数组
				for (int j = 0; j < columnCount; j++) {
					values[j] = table.getValueAt(rowcount, j);
				}
				updateSaveAction(values); // 执行修改保存操作
			}
		});

		// 搜索功能
		search.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String inputValue = JOptionPane.showInputDialog("请输入搜索内容");
				// 判断输入值是否为空
				if (inputValue == null || inputValue.length() == 0) {
					showErrorMsg("搜索内容不能为空");
					return; // 终止后面代码执行
				}
				rowData = searchAction(inputValue);
				tableModel.getDataVector().removeAllElements();
				tableModel = new DefaultTableModel(rowData, columnNames);
				table.setModel(tableModel);
			}

		});
		// 刷新表格数据
		refresh.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				rowData = tableDataInit(); // 刷新数据时候重新调用数据初始化
				tableModel.getDataVector().removeAllElements();
				tableModel = new DefaultTableModel(rowData, columnNames);
				table.setModel(tableModel);
			}

		});
	}

	/**
	 * 判断对象是否为空
	 *
	 * @param obj
	 */
	public static void checkEmpty(Object obj) {
		if (obj == null) {
			showErrorMsg("请输入每一列内容");
			return;
		}
	}

	/**
	 * 显示错误消息
	 *
	 * @param msg
	 */
	public static void showErrorMsg(String msg) {
		JOptionPane.showMessageDialog(null, msg, "错误提示", JOptionPane.ERROR_MESSAGE);
	}

	/**
	 * 显示确认弹出框 确认删除 返回true,取消返回false
	 *
	 * @return
	 */
	public static boolean showConfirm(String msg) {
		int n = JOptionPane.showConfirmDialog(null, msg, "确认对话框", JOptionPane.YES_NO_OPTION);
		if (n == JOptionPane.YES_OPTION) {
			return true;
		} else if (n == JOptionPane.NO_OPTION) {
			return false;
		}
		return false;
	}

	public void setRowData(Object[][] rowData) {
		this.rowData = rowData;
	}

	public abstract String[] columnNamesInit();

	public abstract Object[][] tableDataInit();

	/**
	 * 根据表格第一列执行多选删除操作 [推荐批处理]
	 *
	 * @param ids
	 *            第一列选中值数组
	 */
	public abstract void deleteMoreAction(Object[] ids);

	/**
	 * 获取表格行中数据进行添加操作
	 *
	 * @param obj
	 */
	public abstract void addSaveAction(Object[] obj);

	/**
	 * 获取表格行中数据进行修改保存操作
	 *
	 * @param obj
	 */
	public abstract void updateSaveAction(Object[] obj);

	/**
	 * 根据输入内容进行搜索[推荐模糊查询]
	 *
	 * @param keyword
	 * @return
	 */
	public abstract Object[][] searchAction(String keyword);

	/**
	 * 根据表格中第一个列进行删除
	 *
	 * @param id
	 *            第一个列的值
	 */
	public abstract void deleteAction(Object id);

}
